package thread;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// CountDownLatch 的使用，这个就是把 一个大的任务，拆分成多个 “子任务”
public class Demo33 {
    public static void main(String[] args) throws InterruptedException {
        // 现在我们把 一个任务拆分成10个 子任务
        // 我们可以把这 10个子任务放到线程池中进行执行
        // 当然也可以把它们放到 10个独立的线程这种进行执行
        //这里我们选择使用——线程池
        CountDownLatch count = new CountDownLatch(10);

        ExecutorService executor = Executors.newFixedThreadPool(4);
        for (int i = 0; i < 10; i++) {
            int id = i;
            executor.submit(() -> {
                System.out.println("子任务开始执行 " + id);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("子任务执行结束 " + id);
                count.countDown();//子任务结束一次就要进行减少一次
            });
        }

        //等待分割的所有子任务都结束了，我们才能继续往下执行，所以这里我们要对于所有的子任务进行等待
        count.await();
        System.out.println("所有的子任务都执行结束");

        //对于线程池进行结束
        executor.shutdown();
    }
}
